home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib06.dsk / X-Y PLOT.bas < prev   
BASIC Source File  |  2023-02-26  |  9KB  |  296 lines

  1. 1  REM  *****************************
  2. 2  REM  *   GRAPHING PROGRAM I      *
  3. 3  REM  *      X-Y PLOT             *
  4. 4  REM  *    BY ROB SMYTHE          *
  5. 5  REM  *   COPYRIGHT (C) 1981      *
  6. 6  REM  *   BY MICRO-SPARC INC      *
  7. 7  REM  *****************************
  8. 13  HOME : VTAB 5: HTAB 10: PRINT "GRAPHING PROGRAM 1"
  9. 14  VTAB 15: HTAB 13: PRINT "R.M. SMYTHE"
  10. 15  FOR I = 1 TO 2000: NEXT 
  11. 16 :
  12. 17  REM  SET UP PROGRAM
  13. 18 :
  14. 19  GOSUB 10000: REM  INITIALIZE HRCG
  15. 20  POKE  -16302,0: LOMEM: 16400
  16. 30 M$ = "                                        "
  17. 40 S$ = "                                        "
  18. 50 FLAG = 0
  19. 60  DIM X(20),Y(20)
  20. 70 D$ =  CHR$(4):G$ =  CHR$(7)
  21. 97 :
  22. 98  REM  CONTROL CHARACTERS
  23. 99 :
  24. 100 CP$ =  CHR$(16): REM  CLEAR PAGE
  25. 110 CL$ =  CHR$(12): REM  LOWER CASE
  26. 120 CK$ =  CHR$(11): REM  UPPER CASE
  27. 130 CO$ =  CHR$(15): REM  OPTIONS
  28. 140 CS$ =  CHR$(19): REM  SHIFT
  29. 150 CY$ =  CHR$(25): REM  SET TEXT WINDOW TO FULL SCREEN
  30. 160 CA$ =  CHR$(1): REM  SELECT CHARACTER SET OR PAGE 1 OPTION
  31. 170  PRINT CO$,CA$: REM  USE PG 1
  32. 180  PRINT CY$;CP$
  33. 190  GOTO 1000
  34. 197 :
  35. 198  REM  DRAW X,Y AXES
  36. 199 :
  37. 200  PRINT CP$
  38. 210  GOSUB 600: REM  ADD SCALES
  39. 220  HCOLOR= 3: HPLOT 52,20 TO 52,151 TO 275,151
  40. 230  RETURN 
  41. 297 :
  42. 298  REM  PLOT POINTS
  43. 299 :
  44. 300  FOR I = 1 TO N -1
  45. 310 X1 =  INT(X(I) *FX%/MX +53.5)
  46. 320 Y1 =  INT(151 -Y(I) *122/MY +.5)
  47. 330 X2 =  INT(X(I +1) *FX%/MX +53.5)
  48. 340 Y2 =  INT(151 -Y(I +1) *122/MY +.5)
  49. 350  HCOLOR= 3
  50. 360  FOR J =  -1 TO 1: FOR K =  -1 TO 1
  51. 370  HPLOT X1 +J,Y1 +K
  52. 380  NEXT K,J
  53. 390  HCOLOR= 3: HPLOT X1,Y1 TO X2,Y2: NEXT 
  54. 400  FOR J =  -1 TO 1: FOR K =  -1 TO 1: HPLOT X2 +J,Y2 +K: NEXT K,J
  55. 410  RETURN 
  56. 597 :
  57. 598  REM  ADD SCALES TO GRAPH
  58. 599 :
  59. 600  VTAB 20: HTAB 8: PRINT HA$: HTAB 8: PRINT SC$
  60. 605  IF S1$ < >""  THEN 610
  61. 606  VTAB 4: IF  LEN( STR$(MY)) >4  THEN  HTAB (4): GOTO 608
  62. 607  HTAB (8 - LEN( STR$(MY)))
  63. 608  PRINT MY: RETURN 
  64. 610 V% = 20
  65. 620 H% = 7: VTAB 22:V$ = S1$: GOSUB 9000
  66. 630 H% = 6: VTAB 22:V$ = S2$: GOSUB 9000
  67. 640 H% = 5: VTAB 22:V$ = S3$: GOSUB 9000
  68. 650  RETURN 
  69. 697 :
  70. 698  REM  BEGIN INPUT
  71. 699 :
  72. 700  PRINT CP$;CL$;CS$;"THIS ROUTINE WILL PLOT POINTS ON AN X,Y GRAPH, WITH (0,0) IN BOTTOM LEFT CORNER."
  73. 710  PRINT : PRINT CS$;"ENTER POINTS.  ";CS$;"WHEN FINISHED, ENTER A   NEGATIVE NUMBER."
  74. 720  PRINT : PRINT CS$;"HIT <RETURN> AFTER ENTERING EACH NUMBER."
  75. 730  VTAB 10: PRINT "     X          Y"
  76. 740  HCOLOR= 3
  77. 750  HPLOT 10,84 TO 150,84
  78. 760  HPLOT 75,74 TO 75,191
  79. 770  VTAB 12: PRINT  CHR$(22)
  80. 780 I = 1
  81. 790 MX = 0:MY = 0
  82. 800  HTAB (4): INPUT X(I): IF X(I) <0  THEN N = I -1: GOTO 890
  83. 810  VTAB  PEEK(37): HTAB (14)
  84. 820  HPLOT 75,90 TO 75,191: INPUT Y(I)
  85. 830  IF Y(I) <0  THEN N = I -1: GOTO 890
  86. 840  IF X(I) >MX  THEN MX = X(I)
  87. 850  IF Y(I) >MY  THEN MY = Y(I)
  88. 860  IF I >7  THEN  PRINT CO$CS$
  89. 870 I = I +1
  90. 880  GOTO 800
  91. 890 NUMPTS = N: RETURN 
  92. 997 :
  93. 998  REM  *** MAIN PROGRAM ***
  94. 999 :
  95. 1000  GOSUB 700: REM  INPUT DATA
  96. 1010  GOSUB 5000: REM  SORT X'S
  97. 1020  PRINT CY$;CP$: REM  CLEAR FULL SCREEN
  98. 1030  GOSUB 4000: REM  HORIZONTAL SCALE
  99. 1040  GOSUB 6000: REM  VERTICAL SCALE
  100. 1050  GOSUB 200: REM  DRAW AXES
  101. 1060  GOSUB 300: REM  PLOT
  102. 1070  POKE  -16368,0
  103. 1080 A =  PEEK( -16384): IF A <128  THEN 1080
  104. 1090  POKE  -16368,0
  105. 1100 A$ =  CHR$(A -128)
  106. 1110  IF A$ = "X"  THEN 1230
  107. 1120  IF A$ = "Y"  THEN 1190
  108. 1130  IF A$ = "T"  THEN 1260
  109. 1140  IF A$ = "S"  THEN 1300
  110. 1150  IF A$ = "A"  THEN 1000
  111. 1160  IF A$ = "E"  THEN  VTAB 23: END 
  112. 1170  FOR I = 1 TO 20: NEXT 
  113. 1180  GOTO 1080
  114. 1190 H% = 3:V% = 20:L = 18
  115. 1200  GOSUB 8000
  116. 1210 FLAG = 1
  117. 1220  GOTO 1070
  118. 1230 L = 30:V% = 23
  119. 1240  GOSUB 7000
  120. 1250  GOTO 1070
  121. 1260 L = 35:V% = 2: GOSUB 7000: GOTO 1070
  122. 1270 :
  123. 1280  REM  SAVE
  124. 1290 :
  125. 1300  VTAB 10: PRINT G$;G$
  126. 1310 F$ = ""
  127. 1320  POKE  -16368,0
  128. 1330 A =  PEEK( -16384): IF A <128  THEN 1330
  129. 1340  POKE  -16368,0
  130. 1350 A$ =  CHR$(A -128): IF A$ =  CHR$(13)  THEN 1380
  131. 1360  IF F$ = ""  AND (A$ <"A"  OR A$ >"Z")  THEN 1300
  132. 1370 F$ = F$ +A$: GOTO 1330
  133. 1380  IF F$ = ""  THEN 1300
  134. 1390  PRINT G$;G$;G$:F$ = "GR-" +F$
  135. 1400  PRINT D$;"BSAVE";F$;",A8192,L8192"
  136. 1410  GOTO 1070
  137. 3997 :
  138. 3998  REM  HORIZONTAL SCALE
  139. 3999 :
  140. 4000  IF MX >100  THEN 4210
  141. 4010  IF MX >50  THEN MX = 100: GOTO 4100
  142. 4020  IF MX >20  THEN MX = 50: GOTO 4130
  143. 4030  IF MX >10  THEN MX = 20: GOTO 4150
  144. 4040  IF MX >5  THEN MX = 10: GOTO 4160
  145. 4050  IF MX >1  THEN MX = 5: GOTO 4170
  146. 4060  IF MX >.5  THEN MX = 1: GOTO 4180
  147. 4070  IF MX >.1  THEN MX = .5: GOTO 4190
  148. 4080  IF MX >.01  THEN MX = .1: GOTO 4200
  149. 4090  GOTO 4210
  150. 4100 SC$ = "0    20    40    60    80    100"
  151. 4110 MX = 100
  152. 4120 HA$ = "'  '  '  '  '  '  '  '  '  '   '":FX% = 208: RETURN 
  153. 4130 SC$ = "0    10    20    30    40    50"
  154. 4140  GOTO 4120
  155. 4150 SC$ = "0  2  4  6  8 10 12 14 16 18 20": GOTO 4120
  156. 4160 SC$ = "0  1  2  3  4  5  6  7  8  9 10": GOTO 4120
  157. 4170 SC$ = "0     1     2     3     4     5": GOTO 4120
  158. 4180 SC$ = "0    .2    .4    .6    .8   1.0": GOTO 4120
  159. 4190 SC$ = "0   .10   .20   .30   .40   .50": GOTO 4120
  160. 4200 SC$ = "0   .02   .04   .06   .08   .10": GOTO 4120
  161. 4210 SC$ =  RIGHT$("                               " + STR$(MX$),31):HA$ = "'                             '":FX% = 208: RETURN 
  162. 4997 :
  163. 4998  REM  SORT IN INCREASING X
  164. 4999 :
  165. 5000 L =  INT(NUMPTS/2) +1
  166. 5010 K = NUMPTS
  167. 5020  IF L = 1  THEN 5060
  168. 5030 L = L -1
  169. 5040 X = X(L):Y = Y(L)
  170. 5050  GOTO 5100
  171. 5060 X = X(K):Y = Y(K)
  172. 5070 X(K) = X(L):Y(K) = Y(L)
  173. 5080 K = K -1
  174. 5090  IF K <1  THEN X(I) = X:Y(I) = Y: RETURN 
  175. 5100 J = L
  176. 5110 I = J
  177. 5120 J = J +J
  178. 5130  IF J >K  THEN X(I) = X:Y(I) = Y: GOTO 5020
  179. 5140  IF J <K  THEN  IF X(J) <X(J +1)  THEN J = J +1
  180. 5150  IF X > = X(J)  THEN X(I) = X:Y(I) = Y: GOTO 5020
  181. 5160 X(I) = X(J):Y(I) = Y(J): GOTO 5110
  182. 5997 :
  183. 5998  REM  VERTICAL SCALE
  184. 5999 :
  185. 6000 S1$ = "":S2$ = S1$:S3$ = S2$: IF MY >100  THEN 6290
  186. 6010  IF MY >50  THEN MY = 100: GOTO 6100
  187. 6020  IF MY >20  THEN MY = 50: GOTO 6140
  188. 6030  IF MY >10  THEN MY = 20: GOTO 6170
  189. 6040  IF MY >5  THEN MY = 10: GOTO 6180
  190. 6050  IF MY >1  THEN MY = 5: GOTO 6200
  191. 6060  IF MY >.5  THEN MY = 1: GOTO 6210
  192. 6070  IF MY >.1  THEN MY = .5: GOTO 6230
  193. 6080  IF MY >.01  THEN MY = .1: GOTO 6250
  194. 6090  GOTO 6290
  195. 6100 S1$ = "0  0  0  0  0  0"
  196. 6110 S2$ = "0  8  6  4  2   "
  197. 6120 S3$ = "1               "
  198. 6130  RETURN 
  199. 6140 S1$ = "0  0  0  0  0  0"
  200. 6150 S2$ = "5  4  3  2  1   "
  201. 6160  GOTO 6280
  202. 6170 S1$ = "0  6  2  8  4  0":S2$ = "2  1  1         ": GOTO 6280
  203. 6180 S1$ = "0  8  6  4  2  0"
  204. 6190 S2$ = "1               ": GOTO 6280
  205. 6200 S1$ = "5  4  3  2  1  0": GOTO 6270
  206. 6210 S1$ = "0  8  6  4  2  0":S2$ = ".  .  .  .  .   "
  207. 6220 S3$ = "1               ": RETURN 
  208. 6230 S1$ = "0  0  0  0  0  0":S2$ = "5  4  3  2  1   "
  209. 6240 S3$ = ".  .  .  .  .   ": RETURN 
  210. 6250 S1$ = "0  8  6  4  2  0":S2$ = "1  0  0  0  0   "
  211. 6260 S3$ = ".  .  .  .  .   ": RETURN 
  212. 6270 S2$ = "                "
  213. 6280 S3$ = "                ": RETURN 
  214. 6290  RETURN : REM  SCIENTIFIC NOTATION COULD GO HERE
  215. 6997 :
  216. 6998  REM  LABEL X AXIS
  217. 6999 :
  218. 7000 B$ =  MID$ (M$,1,L)
  219. 7010  VTAB V%
  220. 7020  GOSUB 7040
  221. 7030  RETURN 
  222. 7040 I = 1
  223. 7050 H% = 40 -L -2
  224. 7060  HTAB (H%)
  225. 7070  PRINT  MID$ (B$, LEN(B$) -L +1, LEN(B$));
  226. 7080  HTAB (H% +L)
  227. 7090  GET X$: IF X$ =  CHR$(13)  THEN 7210
  228. 7100  IF X$ < > CHR$(8)  THEN 7150
  229. 7110  IF I = 1  THEN 7060
  230. 7120 B$ =  MID$ (B$,1, LEN(B$) -1)
  231. 7130 I = I -1
  232. 7140  GOTO 7060
  233. 7150  IF I = L +1  THEN 7060
  234. 7170  IF  ASC(X$) <32  THEN 7060
  235. 7180 B$ = B$ +X$
  236. 7190 I = I +1
  237. 7200  GOTO 7060
  238. 7210 B$ =  MID$ (B$, LEN(B$) -I +2, LEN(B$))
  239. 7220 B$ = B$ + MID$ (S$,1,L - LEN(B$))
  240. 7230  PRINT 
  241. 7240  RETURN 
  242. 7997 :
  243. 7998  REM  LABEL Y AXIS
  244. 7999 :
  245. 8000 B$ =  MID$ (M$,1,L)
  246. 8010  HTAB H%
  247. 8020  VTAB (V%)
  248. 8030  GOSUB 8050
  249. 8040  RETURN 
  250. 8050 I = 1
  251. 8060  VTAB (V%)
  252. 8070 V$ =  MID$ (B$, LEN(B$) -L +1, LEN(B$)): GOSUB 9000: REM  PRINT OUT VERTICAL STRING
  253. 8080  REM  VTAB(V%-L%)
  254. 8090  GET X$: IF X$ =  CHR$(13)  THEN 8210
  255. 8100  IF X$ < > CHR$(8)  THEN 8150
  256. 8110  IF I = 1  THEN 8060
  257. 8120 B$ =  MID$ (B$,1, LEN(B$) -1)
  258. 8130 I = I -1
  259. 8140  GOTO 8060
  260. 8150  IF I = L +1  THEN 8060
  261. 8170  IF  ASC(X$) <32  THEN 8060
  262. 8180 B$ = B$ +X$
  263. 8190 I = I +1
  264. 8200  GOTO 8060
  265. 8210 B$ =  MID$ (B$, LEN(B$) -I +2, LEN(B$))
  266. 8220 B$ = B$ + MID$ (S$,1,L - LEN(B$))
  267. 8230  PRINT 
  268. 8240  RETURN 
  269. 8997 :
  270. 8998  REM  PRINT OUT VERTICAL STRING
  271. 8999 :
  272. 9000  VTAB (V% - LEN(V$))
  273. 9010  FOR J = 1 TO  LEN(V$)
  274. 9020  HTAB (H%)
  275. 9030  PRINT  MID$ (V$,J,1)
  276. 9040  NEXT 
  277. 9050  RETURN 
  278. 9997 :
  279. 9998  REM  INITIALIZE HRCG
  280. 9999 :
  281. 10000  ONERR  GOTO 10130
  282. 10010  TEXT : HOME : HGR :ADRS = 0
  283. 10020  PRINT  CHR$(4);"BLOAD RBOOT": CALL 520
  284. 10030 ADRS =  USR(0),"HRCG"
  285. 10040  POKE 216,0
  286. 10050  IF ADRS <0  THEN ADRS = ADRS +65536
  287. 10060 CS = ADRS -768: HIMEM: CS
  288. 10070 D$ =  CHR$(4)
  289. 10080  PRINT D$;"BLOAD ASCII.SET,A";CS
  290. 10090 CH =  INT(CS/256):CL = CS -CH *256
  291. 10100  POKE ADRS +7,CL: POKE ADRS +8,CH: CALL ADRS +3
  292. 10110  RETURN 
  293. 10130  TEXT 
  294. 10140  PRINT "ERROR IN RLOAD OR RBOOT"
  295. 10150  POKE 216,0
  296. 10160  STOP